数组快速创建问题
我们有时候需要快速创建一个数组,比如一个1-30
的下拉列表,该怎么写呢?
如果我们直接在初始化的时候赋值 ,代码会显得冗余不堪。
而如果用 for
循环一个个push
,也觉得不够简洁。
data(){
return {
arr : [1, 2, 3, ......, 29, 30],
arr2 : []
}
}
created(){
for(let i = 1; i <= 30; i++){
this.arr2.push(i);
}
}
ES6
里面为此类情况提供了Array.from
函数,它能将伪数组变成数组(length
属性需存在)。以下是相关代码示例:
<div v-for="item in arr3" :key="item">{{ item }}</div>
data(){
return {
arr : Array.from('12345'), // ["1", "2", "3", "4", "5"]
arr2 : Array.from({ 0 : 'a', 1 : 'b', length : 2 }), // ["a", "b"]
arr3 : Array.from({ length: 30 }, (item, index) => index + 1), // [1, 2, 3, ......, 29, 30]
arr4 : Array.from({ length: 4 }, () => ({})) // [{}, {}, {}, {}]
}
}
与此同时,v-for
可以接收整数,不一定要是变量。在这种情况下,它会把模板重复对应次数。目前来看这种方式是最快捷的。
<Select v-model="value">
<Option v-for="n in 30" :value="n" :key="n">
{{ n }}
</Option>
</Select>
// 1,2,3......30
排序稳定性问题
常见的排序算法之中,插入排序、合并排序、冒泡排序等都是稳定的,堆排序、快速排序等是不稳定的。
不稳定排序的主要缺点是,多重排序时可能会产生问题。
假设有一个姓和名的列表,要求按照“姓氏为主要关键字,名字为次要关键字”进行排序。开发者可能会先按名字排序,再按姓氏进行排序。如果排序算法是稳定的,这样就可以达到“先姓氏,后名字”的排序效果。如果是不稳定的,就不行。
Array.prototype.sort()
为数组自带的排序方法,该方法在早期实现中,排序是否稳定,留给浏览器自己决定,这导致一部分实现是不稳定的。
但ES2019明确规定,Array.prototype.sort()
的默认排序算法必须稳定。目前规定已经做到了,现在 JavaScript
各个主要实现的默认排序算法都是稳定的。
下面我们可以通过代码实例来查看一下相关效果:
const arr = [
'peach',
'straw',
'apple',
'spork'
];
const stableSorting = (s1, s2) => {
if (s1[0] < s2[0]) return -1;
return 1;
};
arr.sort(stableSorting)
// ["apple", "peach", "straw", "spork"]
上面代码对数组arr
按照首字母进行排序。排序结果中,straw
在spork
的前面,跟原始顺序一致,排序算法稳定